from django.shortcuts import render
from rest_framework.views import APIView
import random, logging
from django_redis import get_redis_connection
from rest_framework.response import Response
from rest_framework import status

from . import constants
from meiduo_mall.libs.yuntongxun.sms import CCP
from celery_tasks.sms.tasks import send_sms_code
# Create your views here.

logger = logging.getLogger('django')
class SMSCodeView(APIView):
    # 发送短信验证码
    # def get(self, request, moblie):
    #     # 生成短信验证吗,随机生成6为验证码
    #     sms_code = '%06d' % random.randint(0, 999999)
    #     logger.info(sms_code)
    #     # 保存短信验证码到redis
    #     redis_conn = get_redis_connection('verify_codes')
    #     # redis.conn.setex('key', '过期时间', 'value')
    #     redis_conn.setex('sms_%s' % moblie, constans.SMS_CODE_REDIS_EXPIRES, sms_code)
    #     # 使用容联云通讯发送短信验证码,两个除号取证,每5分钟发一次,最后的1是模板id
    #     # CCP.send_template_sms(moblie, [sms_code, constans.SMS_CODE_REDIS_EXPIRES // 60], 1)
    #     # 响应结果
    #     return Response({'message':'OK'})
    # 改进之后
    def get(self, request, moblie):
        # 首先创建链接,链接到redis
        redis_conn = get_redis_connection('verify_codes')

        # 使用管道:将多个redis指令放在一个管道里,统一执行,降低redis使用频率,提升性能
        pl = redis_conn.pipline()

        # 县判断用户在60s内是否重复发送,从redis数据库里拿去数据
        send_flag = pl.get('send_flag_%s' % moblie)
        if send_flag:
            # 如果send_flag有值,说明60s内已经发送过一次了
            return Response({'message':'频繁发送短信'})

        # 生成短信验证码
        sms_code = '%06d' % random.randint(0, 999999)
        logger.info()


        # 保存短信验证码到redis数据库中,下次发送短信时需要先判断用户是否有标记
        # redis_conn.setex('sms_%s' % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
        pl.setex('sms_%s' % moblie, constants.SMS_CODE_REDIS_EXPIRES, sms_code)


        # 在给redis中添加一个已经发送短信的标记
        # redis_conn.setex('send_flag_%s' % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
        pl.setex('send_flag_%s' % moblie, constants.SEND_SMS_CODE_INTERVAL, 1)

        # 注意,一定要执行下列管道
        pl.excute()

        # 这个是原本发送短信的,但是我们可以把他放在celery中,异步实现
        # CCP().send_template_sms(mobile, [sms_code, constants.SMS_CODE_REDIS_EXPIRES // 60], 1)

        # 使用异步发送短信
        send_sms_code.delay(moblie, sms_code) # 调用delay(),触发celery异步任务

        # 响应结果
        return Response({'messsage':'OK'})